const express = require('express')
const { getDb, saveDb } = require('./db')

const app = express()
// 配置解析表单请求体 application/json
app.use(express.json())
// 配置解析 application/x-www-form-urlencoded表单请求体数据
app.use(express.urlencoded({ extended: false }))

app.get('/todos', async (req, res, next) => {
    try {
        const db = await getDb()
        res.status(200).json(db.todos)
    } catch (err) { // 捕获到错误后，将错误传递给错误处理中间件处理
        next(err) // 这个next会跳过所有剩余的非错误处理路由和中间件函数，直接到错误处理中间件
    }
})

// 通常会在所有路由之后配置处理404
app.use((req, res, next) => {
    res.status(404).send('404 Not Found.')
})


// 错误处理中间件
// 在所有的中间件之后挂载错误处理中间件
// 错误处理中间件始终带有4个参数，必须提供4个参数以将其标识为错误处理中间件
// 即使不需要使用next对象，也必须指定它以维护签名。否则，该next对象将被解释为常规中间件，并且将无法处理错误
// 如果将任务内容传递给next() 函数（字符串'route'除外)，Express都会将当前请求视为错误，并且将跳过所有剩余的非错误处理路由和中间件函数。

app.use((err, req, res, next) => {
    console.error(err)
    res.status(500).json(err.message)
})

app.listen(3000, () => {
    console.log('Server is running at http://localhost:3000/')
})